package pokeronlab_2014.mcts;

import pokeronlab_2014.SVMClassifierData;

public abstract class TreeNode {
	public double numberOfVisits, totalValue;
	public SVMClassifierData SVMInput;
	public GameState state;
	protected TreeNode[] children;
	public TreeNode parent;
	public int numberOfChildren;
	
	public TreeNode(){
		
	}
	
	public TreeNode(TreeNode node){
		this.SVMInput = node.SVMInput.copy();
		this.state = node.state.copy();
	}
	
	//GAME OVER ELLENŐRZÉSE A SELECTBEN
	/**
	 * Kiválaszt egy TreeNode-t a gyerekek közül, ahol nincs vége a játéknak.
	 * 
	 * @return A kiválasztott TreeNode
	 */
	public abstract TreeNode select();
	
	/**
	 * A default expand az osztályra, az összes csúcsot létrehozza.
	 */
	public abstract void expand();
	
	public abstract TreeNode simulate();
	
	/**
	 * Visszaterjeszti a kapott értéket a szülőnek
	 * 
	 * @param valueOfSimulation A visszaterjesztendő érték
	 * @return A szülőcsúcs (mivel nem rekurzív algoritmus)
	 */
	public TreeNode backpropagate(double valueOfSimulation){
		numberOfVisits++;
		totalValue += valueOfSimulation;
		return parent;
	}
	/**
	 * @return A visszatérési érték igaz, ha van gyereke
	 */
	public boolean hasChildren() {
		if(children != null){
			return true;
		}else{
			return false;
		}
	}
	
	public TreeNode getChild(int childNum){
		return children[childNum];
	}
	
}
